| import qualified Maybe import qualified Prelude
|
| data FiniteMap a b = EmptyFM | Branch a b Int (FiniteMap a b) (FiniteMap a b)
|
| instance (Eq a, Eq b) => Eq (FiniteMap a b) where
|
| addListToFM_C :: Ord a => (b -> b -> b) -> FiniteMap a b -> [(a,b)] -> FiniteMap a b
addListToFM_C | combiner fm key_elt_pairs | = |
foldl add fm key_elt_pairs | where |
add | fmap (key,elt) | = | addToFM_C combiner fmap key elt |
|
|
|
|
| addToFM_C :: Ord a => (b -> b -> b) -> FiniteMap a b -> a -> b -> FiniteMap a b
addToFM_C | combiner EmptyFM key elt | = | unitFM key elt |
addToFM_C | combiner (Branch key elt size fm_l fm_r) new_key new_elt | |
| | new_key < key | = |
mkBalBranch key elt (addToFM_C combiner fm_l new_key new_elt) fm_r |
|
| | new_key > key | = |
mkBalBranch key elt fm_l (addToFM_C combiner fm_r new_key new_elt) |
|
| | otherwise | = |
Branch new_key (combiner elt new_elt) size fm_l fm_r |
|
|
|
| emptyFM :: FiniteMap a b
|
| findMax :: FiniteMap a b -> (a,b)
findMax | (Branch key elt _ _ EmptyFM) | = | (key,elt) |
findMax | (Branch key elt _ _ fm_r) | = | findMax fm_r |
|
| findMin :: FiniteMap a b -> (a,b)
findMin | (Branch key elt _ EmptyFM _) | = | (key,elt) |
findMin | (Branch key elt _ fm_l _) | = | findMin fm_l |
|
| mkBalBranch :: Ord a => a -> b -> FiniteMap a b -> FiniteMap a b -> FiniteMap a b
mkBalBranch | key elt fm_L fm_R | |
| | size_l + size_r < 2 | = |
mkBranch 1 key elt fm_L fm_R |
|
| | size_r > sIZE_RATIO * size_l | = |
case | fm_R of |
| Branch _ _ _ fm_rl fm_rr | |
| | sizeFM fm_rl < 2 * sizeFM fm_rr | -> |
|
| | otherwise | -> |
|
|
|
|
| | size_l > sIZE_RATIO * size_r | = |
case | fm_L of |
| Branch _ _ _ fm_ll fm_lr | |
| | sizeFM fm_lr < 2 * sizeFM fm_ll | -> |
|
| | otherwise | -> |
|
|
|
|
| | otherwise | = |
mkBranch 2 key elt fm_L fm_R | where |
double_L | fm_l (Branch key_r elt_r _ (Branch key_rl elt_rl _ fm_rll fm_rlr) fm_rr) | = | mkBranch 5 key_rl elt_rl (mkBranch 6 key elt fm_l fm_rll) (mkBranch 7 key_r elt_r fm_rlr fm_rr) |
|
double_R | (Branch key_l elt_l _ fm_ll (Branch key_lr elt_lr _ fm_lrl fm_lrr)) fm_r | = | mkBranch 10 key_lr elt_lr (mkBranch 11 key_l elt_l fm_ll fm_lrl) (mkBranch 12 key elt fm_lrr fm_r) |
|
single_L | fm_l (Branch key_r elt_r _ fm_rl fm_rr) | = | mkBranch 3 key_r elt_r (mkBranch 4 key elt fm_l fm_rl) fm_rr |
|
single_R | (Branch key_l elt_l _ fm_ll fm_lr) fm_r | = | mkBranch 8 key_l elt_l fm_ll (mkBranch 9 key elt fm_lr fm_r) |
|
|
|
|
|
|
|
| mkBranch :: Ord a => Int -> a -> b -> FiniteMap a b -> FiniteMap a b -> FiniteMap a b
mkBranch | which key elt fm_l fm_r | = |
let |
result | | = | Branch key elt (unbox (1 + left_size + right_size)) fm_l fm_r |
|
|
in | result |
| where |
|
left_ok | | = |
case | fm_l of |
| EmptyFM | -> | True |
| Branch left_key _ _ _ _ | -> |
let |
biggest_left_key | | = | fst (findMax fm_l) |
|
|
in | biggest_left_key < key |
|
|
|
|
right_ok | | = |
case | fm_r of |
| EmptyFM | -> | True |
| Branch right_key _ _ _ _ | -> |
let |
smallest_right_key | | = | fst (findMin fm_r) |
|
|
in | key < smallest_right_key |
|
|
|
|
unbox :: Int -> Int
|
|
|
|
| sIZE_RATIO :: Int
|
| sizeFM :: FiniteMap a b -> Int
sizeFM | EmptyFM | = | 0 |
sizeFM | (Branch _ _ size _ _) | = | size |
|
| unitFM :: a -> b -> FiniteMap a b
unitFM | key elt | = | Branch key elt 1 emptyFM emptyFM |
|
| import qualified Maybe import qualified Prelude
|
| data FiniteMap a b = EmptyFM | Branch a b Int (FiniteMap a b) (FiniteMap a b)
|
| instance (Eq a, Eq b) => Eq (FiniteMap a b) where
|
| addListToFM_C :: Ord a => (b -> b -> b) -> FiniteMap a b -> [(a,b)] -> FiniteMap a b
addListToFM_C | combiner fm key_elt_pairs | = |
foldl add fm key_elt_pairs | where |
add | fmap (key,elt) | = | addToFM_C combiner fmap key elt |
|
|
|
|
| addToFM_C :: Ord b => (a -> a -> a) -> FiniteMap b a -> b -> a -> FiniteMap b a
addToFM_C | combiner EmptyFM key elt | = | unitFM key elt |
addToFM_C | combiner (Branch key elt size fm_l fm_r) new_key new_elt | |
| | new_key < key | = |
mkBalBranch key elt (addToFM_C combiner fm_l new_key new_elt) fm_r |
|
| | new_key > key | = |
mkBalBranch key elt fm_l (addToFM_C combiner fm_r new_key new_elt) |
|
| | otherwise | = |
Branch new_key (combiner elt new_elt) size fm_l fm_r |
|
|
|
| emptyFM :: FiniteMap a b
|
| findMax :: FiniteMap b a -> (b,a)
findMax | (Branch key elt _ _ EmptyFM) | = | (key,elt) |
findMax | (Branch key elt _ _ fm_r) | = | findMax fm_r |
|
| findMin :: FiniteMap a b -> (a,b)
findMin | (Branch key elt _ EmptyFM _) | = | (key,elt) |
findMin | (Branch key elt _ fm_l _) | = | findMin fm_l |
|
| mkBalBranch :: Ord b => b -> a -> FiniteMap b a -> FiniteMap b a -> FiniteMap b a
mkBalBranch | key elt fm_L fm_R | |
| | size_l + size_r < 2 | = |
mkBranch 1 key elt fm_L fm_R |
|
| | size_r > sIZE_RATIO * size_l | = |
mkBalBranch0 fm_L fm_R fm_R |
|
| | size_l > sIZE_RATIO * size_r | = |
mkBalBranch1 fm_L fm_R fm_L |
|
| | otherwise | = |
mkBranch 2 key elt fm_L fm_R | where |
double_L | fm_l (Branch key_r elt_r _ (Branch key_rl elt_rl _ fm_rll fm_rlr) fm_rr) | = | mkBranch 5 key_rl elt_rl (mkBranch 6 key elt fm_l fm_rll) (mkBranch 7 key_r elt_r fm_rlr fm_rr) |
|
double_R | (Branch key_l elt_l _ fm_ll (Branch key_lr elt_lr _ fm_lrl fm_lrr)) fm_r | = | mkBranch 10 key_lr elt_lr (mkBranch 11 key_l elt_l fm_ll fm_lrl) (mkBranch 12 key elt fm_lrr fm_r) |
|
mkBalBranch0 | fm_L fm_R (Branch _ _ _ fm_rl fm_rr) | |
| | sizeFM fm_rl < 2 * sizeFM fm_rr | = |
|
| | otherwise | = |
|
|
|
mkBalBranch1 | fm_L fm_R (Branch _ _ _ fm_ll fm_lr) | |
| | sizeFM fm_lr < 2 * sizeFM fm_ll | = |
|
| | otherwise | = |
|
|
|
single_L | fm_l (Branch key_r elt_r _ fm_rl fm_rr) | = | mkBranch 3 key_r elt_r (mkBranch 4 key elt fm_l fm_rl) fm_rr |
|
single_R | (Branch key_l elt_l _ fm_ll fm_lr) fm_r | = | mkBranch 8 key_l elt_l fm_ll (mkBranch 9 key elt fm_lr fm_r) |
|
|
|
|
|
|
|
| mkBranch :: Ord a => Int -> a -> b -> FiniteMap a b -> FiniteMap a b -> FiniteMap a b
mkBranch | which key elt fm_l fm_r | = |
let |
result | | = | Branch key elt (unbox (1 + left_size + right_size)) fm_l fm_r |
|
|
in | result |
| where |
|
left_ok | | = | left_ok0 fm_l key fm_l |
|
left_ok0 | fm_l key EmptyFM | = | True |
left_ok0 | fm_l key (Branch left_key _ _ _ _) | = |
let |
biggest_left_key | | = | fst (findMax fm_l) |
|
|
in | biggest_left_key < key |
|
|
|
right_ok | | = | right_ok0 fm_r key fm_r |
|
right_ok0 | fm_r key EmptyFM | = | True |
right_ok0 | fm_r key (Branch right_key _ _ _ _) | = |
let |
smallest_right_key | | = | fst (findMin fm_r) |
|
|
in | key < smallest_right_key |
|
|
|
unbox :: Int -> Int
|
|
|
|
| sIZE_RATIO :: Int
|
| sizeFM :: FiniteMap b a -> Int
sizeFM | EmptyFM | = | 0 |
sizeFM | (Branch _ _ size _ _) | = | size |
|
| unitFM :: a -> b -> FiniteMap a b
unitFM | key elt | = | Branch key elt 1 emptyFM emptyFM |
|
| import qualified Maybe import qualified Prelude
|
| data FiniteMap a b = EmptyFM | Branch a b Int (FiniteMap a b) (FiniteMap a b)
|
| instance (Eq a, Eq b) => Eq (FiniteMap a b) where
|
| addListToFM_C :: Ord a => (b -> b -> b) -> FiniteMap a b -> [(a,b)] -> FiniteMap a b
addListToFM_C | combiner fm key_elt_pairs | = |
foldl add fm key_elt_pairs | where |
add | fmap (key,elt) | = | addToFM_C combiner fmap key elt |
|
|
|
|
| addToFM_C :: Ord a => (b -> b -> b) -> FiniteMap a b -> a -> b -> FiniteMap a b
addToFM_C | combiner EmptyFM key elt | = | unitFM key elt |
addToFM_C | combiner (Branch key elt size fm_l fm_r) new_key new_elt | |
| | new_key < key | = |
mkBalBranch key elt (addToFM_C combiner fm_l new_key new_elt) fm_r |
|
| | new_key > key | = |
mkBalBranch key elt fm_l (addToFM_C combiner fm_r new_key new_elt) |
|
| | otherwise | = |
Branch new_key (combiner elt new_elt) size fm_l fm_r |
|
|
|
| emptyFM :: FiniteMap a b
|
| findMax :: FiniteMap a b -> (a,b)
findMax | (Branch key elt xw xx EmptyFM) | = | (key,elt) |
findMax | (Branch key elt xy xz fm_r) | = | findMax fm_r |
|
| findMin :: FiniteMap b a -> (b,a)
findMin | (Branch key elt wy EmptyFM wz) | = | (key,elt) |
findMin | (Branch key elt xu fm_l xv) | = | findMin fm_l |
|
| mkBalBranch :: Ord a => a -> b -> FiniteMap a b -> FiniteMap a b -> FiniteMap a b
mkBalBranch | key elt fm_L fm_R | |
| | size_l + size_r < 2 | = |
mkBranch 1 key elt fm_L fm_R |
|
| | size_r > sIZE_RATIO * size_l | = |
mkBalBranch0 fm_L fm_R fm_R |
|
| | size_l > sIZE_RATIO * size_r | = |
mkBalBranch1 fm_L fm_R fm_L |
|
| | otherwise | = |
mkBranch 2 key elt fm_L fm_R | where |
double_L | fm_l (Branch key_r elt_r zy (Branch key_rl elt_rl zz fm_rll fm_rlr) fm_rr) | = | mkBranch 5 key_rl elt_rl (mkBranch 6 key elt fm_l fm_rll) (mkBranch 7 key_r elt_r fm_rlr fm_rr) |
|
double_R | (Branch key_l elt_l zw fm_ll (Branch key_lr elt_lr zx fm_lrl fm_lrr)) fm_r | = | mkBranch 10 key_lr elt_lr (mkBranch 11 key_l elt_l fm_ll fm_lrl) (mkBranch 12 key elt fm_lrr fm_r) |
|
mkBalBranch0 | fm_L fm_R (Branch vuu vuv vuw fm_rl fm_rr) | |
| | sizeFM fm_rl < 2 * sizeFM fm_rr | = |
|
| | otherwise | = |
|
|
|
mkBalBranch1 | fm_L fm_R (Branch yz zu zv fm_ll fm_lr) | |
| | sizeFM fm_lr < 2 * sizeFM fm_ll | = |
|
| | otherwise | = |
|
|
|
single_L | fm_l (Branch key_r elt_r vux fm_rl fm_rr) | = | mkBranch 3 key_r elt_r (mkBranch 4 key elt fm_l fm_rl) fm_rr |
|
single_R | (Branch key_l elt_l yy fm_ll fm_lr) fm_r | = | mkBranch 8 key_l elt_l fm_ll (mkBranch 9 key elt fm_lr fm_r) |
|
|
|
|
|
|
|
| mkBranch :: Ord a => Int -> a -> b -> FiniteMap a b -> FiniteMap a b -> FiniteMap a b
mkBranch | which key elt fm_l fm_r | = |
let |
result | | = | Branch key elt (unbox (1 + left_size + right_size)) fm_l fm_r |
|
|
in | result |
| where |
|
left_ok | | = | left_ok0 fm_l key fm_l |
|
left_ok0 | fm_l key EmptyFM | = | True |
left_ok0 | fm_l key (Branch left_key wu wv ww wx) | = |
let |
biggest_left_key | | = | fst (findMax fm_l) |
|
|
in | biggest_left_key < key |
|
|
|
right_ok | | = | right_ok0 fm_r key fm_r |
|
right_ok0 | fm_r key EmptyFM | = | True |
right_ok0 | fm_r key (Branch right_key vw vx vy vz) | = |
let |
smallest_right_key | | = | fst (findMin fm_r) |
|
|
in | key < smallest_right_key |
|
|
|
unbox :: Int -> Int
|
|
|
|
| sIZE_RATIO :: Int
|
| sizeFM :: FiniteMap a b -> Int
sizeFM | EmptyFM | = | 0 |
sizeFM | (Branch yu yv size yw yx) | = | size |
|
| unitFM :: a -> b -> FiniteMap a b
unitFM | key elt | = | Branch key elt 1 emptyFM emptyFM |
|
| import qualified Maybe import qualified Prelude
|
| data FiniteMap a b = EmptyFM | Branch a b Int (FiniteMap a b) (FiniteMap a b)
|
| instance (Eq a, Eq b) => Eq (FiniteMap b a) where
|
| addListToFM_C :: Ord a => (b -> b -> b) -> FiniteMap a b -> [(a,b)] -> FiniteMap a b
addListToFM_C | combiner fm key_elt_pairs | = |
foldl add fm key_elt_pairs | where |
add | fmap (key,elt) | = | addToFM_C combiner fmap key elt |
|
|
|
|
| addToFM_C :: Ord b => (a -> a -> a) -> FiniteMap b a -> b -> a -> FiniteMap b a
addToFM_C | combiner EmptyFM key elt | = | addToFM_C4 combiner EmptyFM key elt |
addToFM_C | combiner (Branch key elt size fm_l fm_r) new_key new_elt | = | addToFM_C3 combiner (Branch key elt size fm_l fm_r) new_key new_elt |
|
|
addToFM_C0 | combiner key elt size fm_l fm_r new_key new_elt True | = | Branch new_key (combiner elt new_elt) size fm_l fm_r |
|
|
addToFM_C1 | combiner key elt size fm_l fm_r new_key new_elt True | = | mkBalBranch key elt fm_l (addToFM_C combiner fm_r new_key new_elt) |
addToFM_C1 | combiner key elt size fm_l fm_r new_key new_elt False | = | addToFM_C0 combiner key elt size fm_l fm_r new_key new_elt otherwise |
|
|
addToFM_C2 | combiner key elt size fm_l fm_r new_key new_elt True | = | mkBalBranch key elt (addToFM_C combiner fm_l new_key new_elt) fm_r |
addToFM_C2 | combiner key elt size fm_l fm_r new_key new_elt False | = | addToFM_C1 combiner key elt size fm_l fm_r new_key new_elt (new_key > key) |
|
|
addToFM_C3 | combiner (Branch key elt size fm_l fm_r) new_key new_elt | = | addToFM_C2 combiner key elt size fm_l fm_r new_key new_elt (new_key < key) |
|
|
addToFM_C4 | combiner EmptyFM key elt | = | unitFM key elt |
addToFM_C4 | vvx vvy vvz vwu | = | addToFM_C3 vvx vvy vvz vwu |
|
| emptyFM :: FiniteMap a b
|
| findMax :: FiniteMap b a -> (b,a)
findMax | (Branch key elt xw xx EmptyFM) | = | (key,elt) |
findMax | (Branch key elt xy xz fm_r) | = | findMax fm_r |
|
| findMin :: FiniteMap b a -> (b,a)
findMin | (Branch key elt wy EmptyFM wz) | = | (key,elt) |
findMin | (Branch key elt xu fm_l xv) | = | findMin fm_l |
|
| mkBalBranch :: Ord a => a -> b -> FiniteMap a b -> FiniteMap a b -> FiniteMap a b
mkBalBranch | key elt fm_L fm_R | = | mkBalBranch6 key elt fm_L fm_R |
|
|
mkBalBranch6 | key elt fm_L fm_R | = |
mkBalBranch5 key elt fm_L fm_R (size_l + size_r < 2) | where |
double_L | fm_l (Branch key_r elt_r zy (Branch key_rl elt_rl zz fm_rll fm_rlr) fm_rr) | = | mkBranch 5 key_rl elt_rl (mkBranch 6 key elt fm_l fm_rll) (mkBranch 7 key_r elt_r fm_rlr fm_rr) |
|
double_R | (Branch key_l elt_l zw fm_ll (Branch key_lr elt_lr zx fm_lrl fm_lrr)) fm_r | = | mkBranch 10 key_lr elt_lr (mkBranch 11 key_l elt_l fm_ll fm_lrl) (mkBranch 12 key elt fm_lrr fm_r) |
|
mkBalBranch0 | fm_L fm_R (Branch vuu vuv vuw fm_rl fm_rr) | = | mkBalBranch02 fm_L fm_R (Branch vuu vuv vuw fm_rl fm_rr) |
|
mkBalBranch00 | fm_L fm_R vuu vuv vuw fm_rl fm_rr True | = | double_L fm_L fm_R |
|
mkBalBranch01 | fm_L fm_R vuu vuv vuw fm_rl fm_rr True | = | single_L fm_L fm_R |
mkBalBranch01 | fm_L fm_R vuu vuv vuw fm_rl fm_rr False | = | mkBalBranch00 fm_L fm_R vuu vuv vuw fm_rl fm_rr otherwise |
|
mkBalBranch02 | fm_L fm_R (Branch vuu vuv vuw fm_rl fm_rr) | = | mkBalBranch01 fm_L fm_R vuu vuv vuw fm_rl fm_rr (sizeFM fm_rl < 2 * sizeFM fm_rr) |
|
mkBalBranch1 | fm_L fm_R (Branch yz zu zv fm_ll fm_lr) | = | mkBalBranch12 fm_L fm_R (Branch yz zu zv fm_ll fm_lr) |
|
mkBalBranch10 | fm_L fm_R yz zu zv fm_ll fm_lr True | = | double_R fm_L fm_R |
|
mkBalBranch11 | fm_L fm_R yz zu zv fm_ll fm_lr True | = | single_R fm_L fm_R |
mkBalBranch11 | fm_L fm_R yz zu zv fm_ll fm_lr False | = | mkBalBranch10 fm_L fm_R yz zu zv fm_ll fm_lr otherwise |
|
mkBalBranch12 | fm_L fm_R (Branch yz zu zv fm_ll fm_lr) | = | mkBalBranch11 fm_L fm_R yz zu zv fm_ll fm_lr (sizeFM fm_lr < 2 * sizeFM fm_ll) |
|
mkBalBranch2 | key elt fm_L fm_R True | = | mkBranch 2 key elt fm_L fm_R |
|
mkBalBranch3 | key elt fm_L fm_R True | = | mkBalBranch1 fm_L fm_R fm_L |
mkBalBranch3 | key elt fm_L fm_R False | = | mkBalBranch2 key elt fm_L fm_R otherwise |
|
mkBalBranch4 | key elt fm_L fm_R True | = | mkBalBranch0 fm_L fm_R fm_R |
mkBalBranch4 | key elt fm_L fm_R False | = | mkBalBranch3 key elt fm_L fm_R (size_l > sIZE_RATIO * size_r) |
|
mkBalBranch5 | key elt fm_L fm_R True | = | mkBranch 1 key elt fm_L fm_R |
mkBalBranch5 | key elt fm_L fm_R False | = | mkBalBranch4 key elt fm_L fm_R (size_r > sIZE_RATIO * size_l) |
|
single_L | fm_l (Branch key_r elt_r vux fm_rl fm_rr) | = | mkBranch 3 key_r elt_r (mkBranch 4 key elt fm_l fm_rl) fm_rr |
|
single_R | (Branch key_l elt_l yy fm_ll fm_lr) fm_r | = | mkBranch 8 key_l elt_l fm_ll (mkBranch 9 key elt fm_lr fm_r) |
|
|
|
|
|
|
| mkBranch :: Ord a => Int -> a -> b -> FiniteMap a b -> FiniteMap a b -> FiniteMap a b
mkBranch | which key elt fm_l fm_r | = |
let |
result | | = | Branch key elt (unbox (1 + left_size + right_size)) fm_l fm_r |
|
|
in | result |
| where |
|
left_ok | | = | left_ok0 fm_l key fm_l |
|
left_ok0 | fm_l key EmptyFM | = | True |
left_ok0 | fm_l key (Branch left_key wu wv ww wx) | = |
let |
biggest_left_key | | = | fst (findMax fm_l) |
|
|
in | biggest_left_key < key |
|
|
|
right_ok | | = | right_ok0 fm_r key fm_r |
|
right_ok0 | fm_r key EmptyFM | = | True |
right_ok0 | fm_r key (Branch right_key vw vx vy vz) | = |
let |
smallest_right_key | | = | fst (findMin fm_r) |
|
|
in | key < smallest_right_key |
|
|
|
unbox :: Int -> Int
|
|
|
|
| sIZE_RATIO :: Int
|
| sizeFM :: FiniteMap b a -> Int
sizeFM | EmptyFM | = | 0 |
sizeFM | (Branch yu yv size yw yx) | = | size |
|
| unitFM :: b -> a -> FiniteMap b a
unitFM | key elt | = | Branch key elt 1 emptyFM emptyFM |
|
| import qualified Maybe import qualified Prelude
|
| data FiniteMap a b = EmptyFM | Branch a b Int (FiniteMap a b) (FiniteMap a b)
|
| instance (Eq a, Eq b) => Eq (FiniteMap b a) where
|
| addListToFM_C :: Ord b => (a -> a -> a) -> FiniteMap b a -> [(b,a)] -> FiniteMap b a
addListToFM_C | combiner fm key_elt_pairs | = | foldl (addListToFM_CAdd combiner) fm key_elt_pairs |
|
|
addListToFM_CAdd | vyw fmap (key,elt) | = | addToFM_C vyw fmap key elt |
|
| addToFM_C :: Ord a => (b -> b -> b) -> FiniteMap a b -> a -> b -> FiniteMap a b
addToFM_C | combiner EmptyFM key elt | = | addToFM_C4 combiner EmptyFM key elt |
addToFM_C | combiner (Branch key elt size fm_l fm_r) new_key new_elt | = | addToFM_C3 combiner (Branch key elt size fm_l fm_r) new_key new_elt |
|
|
addToFM_C0 | combiner key elt size fm_l fm_r new_key new_elt True | = | Branch new_key (combiner elt new_elt) size fm_l fm_r |
|
|
addToFM_C1 | combiner key elt size fm_l fm_r new_key new_elt True | = | mkBalBranch key elt fm_l (addToFM_C combiner fm_r new_key new_elt) |
addToFM_C1 | combiner key elt size fm_l fm_r new_key new_elt False | = | addToFM_C0 combiner key elt size fm_l fm_r new_key new_elt otherwise |
|
|
addToFM_C2 | combiner key elt size fm_l fm_r new_key new_elt True | = | mkBalBranch key elt (addToFM_C combiner fm_l new_key new_elt) fm_r |
addToFM_C2 | combiner key elt size fm_l fm_r new_key new_elt False | = | addToFM_C1 combiner key elt size fm_l fm_r new_key new_elt (new_key > key) |
|
|
addToFM_C3 | combiner (Branch key elt size fm_l fm_r) new_key new_elt | = | addToFM_C2 combiner key elt size fm_l fm_r new_key new_elt (new_key < key) |
|
|
addToFM_C4 | combiner EmptyFM key elt | = | unitFM key elt |
addToFM_C4 | vvx vvy vvz vwu | = | addToFM_C3 vvx vvy vvz vwu |
|
| emptyFM :: FiniteMap b a
|
| findMax :: FiniteMap b a -> (b,a)
findMax | (Branch key elt xw xx EmptyFM) | = | (key,elt) |
findMax | (Branch key elt xy xz fm_r) | = | findMax fm_r |
|
| findMin :: FiniteMap b a -> (b,a)
findMin | (Branch key elt wy EmptyFM wz) | = | (key,elt) |
findMin | (Branch key elt xu fm_l xv) | = | findMin fm_l |
|
| mkBalBranch :: Ord a => a -> b -> FiniteMap a b -> FiniteMap a b -> FiniteMap a b
mkBalBranch | key elt fm_L fm_R | = | mkBalBranch6 key elt fm_L fm_R |
|
|
mkBalBranch6 | key elt fm_L fm_R | = | mkBalBranch6MkBalBranch5 key elt fm_L fm_R key elt fm_L fm_R (mkBalBranch6Size_l key elt fm_L fm_R + mkBalBranch6Size_r key elt fm_L fm_R < 2) |
|
|
mkBalBranch6Double_L | vxy vxz vyu vyv fm_l (Branch key_r elt_r zy (Branch key_rl elt_rl zz fm_rll fm_rlr) fm_rr) | = | mkBranch 5 key_rl elt_rl (mkBranch 6 vxy vxz fm_l fm_rll) (mkBranch 7 key_r elt_r fm_rlr fm_rr) |
|
|
mkBalBranch6Double_R | vxy vxz vyu vyv (Branch key_l elt_l zw fm_ll (Branch key_lr elt_lr zx fm_lrl fm_lrr)) fm_r | = | mkBranch 10 key_lr elt_lr (mkBranch 11 key_l elt_l fm_ll fm_lrl) (mkBranch 12 vxy vxz fm_lrr fm_r) |
|
|
mkBalBranch6MkBalBranch0 | vxy vxz vyu vyv fm_L fm_R (Branch vuu vuv vuw fm_rl fm_rr) | = | mkBalBranch6MkBalBranch02 vxy vxz vyu vyv fm_L fm_R (Branch vuu vuv vuw fm_rl fm_rr) |
|
|
mkBalBranch6MkBalBranch00 | vxy vxz vyu vyv fm_L fm_R vuu vuv vuw fm_rl fm_rr True | = | mkBalBranch6Double_L vxy vxz vyu vyv fm_L fm_R |
|
|
mkBalBranch6MkBalBranch01 | vxy vxz vyu vyv fm_L fm_R vuu vuv vuw fm_rl fm_rr True | = | mkBalBranch6Single_L vxy vxz vyu vyv fm_L fm_R |
mkBalBranch6MkBalBranch01 | vxy vxz vyu vyv fm_L fm_R vuu vuv vuw fm_rl fm_rr False | = | mkBalBranch6MkBalBranch00 vxy vxz vyu vyv fm_L fm_R vuu vuv vuw fm_rl fm_rr otherwise |
|
|
mkBalBranch6MkBalBranch02 | vxy vxz vyu vyv fm_L fm_R (Branch vuu vuv vuw fm_rl fm_rr) | = | mkBalBranch6MkBalBranch01 vxy vxz vyu vyv fm_L fm_R vuu vuv vuw fm_rl fm_rr (sizeFM fm_rl < 2 * sizeFM fm_rr) |
|
|
mkBalBranch6MkBalBranch1 | vxy vxz vyu vyv fm_L fm_R (Branch yz zu zv fm_ll fm_lr) | = | mkBalBranch6MkBalBranch12 vxy vxz vyu vyv fm_L fm_R (Branch yz zu zv fm_ll fm_lr) |
|
|
mkBalBranch6MkBalBranch10 | vxy vxz vyu vyv fm_L fm_R yz zu zv fm_ll fm_lr True | = | mkBalBranch6Double_R vxy vxz vyu vyv fm_L fm_R |
|
|
mkBalBranch6MkBalBranch11 | vxy vxz vyu vyv fm_L fm_R yz zu zv fm_ll fm_lr True | = | mkBalBranch6Single_R vxy vxz vyu vyv fm_L fm_R |
mkBalBranch6MkBalBranch11 | vxy vxz vyu vyv fm_L fm_R yz zu zv fm_ll fm_lr False | = | mkBalBranch6MkBalBranch10 vxy vxz vyu vyv fm_L fm_R yz zu zv fm_ll fm_lr otherwise |
|
|
mkBalBranch6MkBalBranch12 | vxy vxz vyu vyv fm_L fm_R (Branch yz zu zv fm_ll fm_lr) | = | mkBalBranch6MkBalBranch11 vxy vxz vyu vyv fm_L fm_R yz zu zv fm_ll fm_lr (sizeFM fm_lr < 2 * sizeFM fm_ll) |
|
|
mkBalBranch6MkBalBranch2 | vxy vxz vyu vyv key elt fm_L fm_R True | = | mkBranch 2 key elt fm_L fm_R |
|
|
mkBalBranch6MkBalBranch3 | vxy vxz vyu vyv key elt fm_L fm_R True | = | mkBalBranch6MkBalBranch1 vxy vxz vyu vyv fm_L fm_R fm_L |
mkBalBranch6MkBalBranch3 | vxy vxz vyu vyv key elt fm_L fm_R False | = | mkBalBranch6MkBalBranch2 vxy vxz vyu vyv key elt fm_L fm_R otherwise |
|
|
mkBalBranch6MkBalBranch4 | vxy vxz vyu vyv key elt fm_L fm_R True | = | mkBalBranch6MkBalBranch0 vxy vxz vyu vyv fm_L fm_R fm_R |
mkBalBranch6MkBalBranch4 | vxy vxz vyu vyv key elt fm_L fm_R False | = | mkBalBranch6MkBalBranch3 vxy vxz vyu vyv key elt fm_L fm_R (mkBalBranch6Size_l vxy vxz vyu vyv > sIZE_RATIO * mkBalBranch6Size_r vxy vxz vyu vyv) |
|
|
mkBalBranch6MkBalBranch5 | vxy vxz vyu vyv key elt fm_L fm_R True | = | mkBranch 1 key elt fm_L fm_R |
mkBalBranch6MkBalBranch5 | vxy vxz vyu vyv key elt fm_L fm_R False | = | mkBalBranch6MkBalBranch4 vxy vxz vyu vyv key elt fm_L fm_R (mkBalBranch6Size_r vxy vxz vyu vyv > sIZE_RATIO * mkBalBranch6Size_l vxy vxz vyu vyv) |
|
|
mkBalBranch6Single_L | vxy vxz vyu vyv fm_l (Branch key_r elt_r vux fm_rl fm_rr) | = | mkBranch 3 key_r elt_r (mkBranch 4 vxy vxz fm_l fm_rl) fm_rr |
|
|
mkBalBranch6Single_R | vxy vxz vyu vyv (Branch key_l elt_l yy fm_ll fm_lr) fm_r | = | mkBranch 8 key_l elt_l fm_ll (mkBranch 9 vxy vxz fm_lr fm_r) |
|
|
mkBalBranch6Size_l | vxy vxz vyu vyv | = | sizeFM vyu |
|
|
mkBalBranch6Size_r | vxy vxz vyu vyv | = | sizeFM vyv |
|
| mkBranch :: Ord b => Int -> b -> a -> FiniteMap b a -> FiniteMap b a -> FiniteMap b a
mkBranch | which key elt fm_l fm_r | = | mkBranchResult key elt fm_l fm_r |
|
|
mkBranchBalance_ok | vwx vwy vwz | = | True |
|
|
mkBranchLeft_ok | vwx vwy vwz | = | mkBranchLeft_ok0 vwx vwy vwz vwx vwz vwx |
|
|
mkBranchLeft_ok0 | vwx vwy vwz fm_l key EmptyFM | = | True |
mkBranchLeft_ok0 | vwx vwy vwz fm_l key (Branch left_key wu wv ww wx) | = | mkBranchLeft_ok0Biggest_left_key fm_l < key |
|
|
mkBranchLeft_ok0Biggest_left_key | vyx | = | fst (findMax vyx) |
|
|
mkBranchLeft_size | vwx vwy vwz | = | sizeFM vwx |
|
|
mkBranchResult | vxu vxv vxw vxx | = | Branch vxu vxv (mkBranchUnbox vxw vxx vxu (1 + mkBranchLeft_size vxw vxx vxu + mkBranchRight_size vxw vxx vxu)) vxw vxx |
|
|
mkBranchRight_ok | vwx vwy vwz | = | mkBranchRight_ok0 vwx vwy vwz vwy vwz vwy |
|
|
mkBranchRight_ok0 | vwx vwy vwz fm_r key EmptyFM | = | True |
mkBranchRight_ok0 | vwx vwy vwz fm_r key (Branch right_key vw vx vy vz) | = | key < mkBranchRight_ok0Smallest_right_key fm_r |
|
|
mkBranchRight_ok0Smallest_right_key | vyy | = | fst (findMin vyy) |
|
|
mkBranchRight_size | vwx vwy vwz | = | sizeFM vwy |
|
| mkBranchUnbox :: Ord a => -> (FiniteMap a b) ( -> (FiniteMap a b) ( -> a (Int -> Int)))
mkBranchUnbox | vwx vwy vwz x | = | x |
|
| sIZE_RATIO :: Int
|
| sizeFM :: FiniteMap a b -> Int
sizeFM | EmptyFM | = | 0 |
sizeFM | (Branch yu yv size yw yx) | = | size |
|
| unitFM :: b -> a -> FiniteMap b a
unitFM | key elt | = | Branch key elt 1 emptyFM emptyFM |
|
| import qualified Maybe import qualified Prelude
|
| data FiniteMap a b = EmptyFM | Branch a b Int (FiniteMap a b) (FiniteMap a b)
|
| instance (Eq a, Eq b) => Eq (FiniteMap a b) where
|
| addListToFM_C :: Ord a => (b -> b -> b) -> FiniteMap a b -> [(a,b)] -> FiniteMap a b
addListToFM_C | combiner fm key_elt_pairs | = | foldl (addListToFM_CAdd combiner) fm key_elt_pairs |
|
|
addListToFM_CAdd | vyw fmap (key,elt) | = | addToFM_C vyw fmap key elt |
|
| addToFM_C :: Ord a => (b -> b -> b) -> FiniteMap a b -> a -> b -> FiniteMap a b
addToFM_C | combiner EmptyFM key elt | = | addToFM_C4 combiner EmptyFM key elt |
addToFM_C | combiner (Branch key elt size fm_l fm_r) new_key new_elt | = | addToFM_C3 combiner (Branch key elt size fm_l fm_r) new_key new_elt |
|
|
addToFM_C0 | combiner key elt size fm_l fm_r new_key new_elt True | = | Branch new_key (combiner elt new_elt) size fm_l fm_r |
|
|
addToFM_C1 | combiner key elt size fm_l fm_r new_key new_elt True | = | mkBalBranch key elt fm_l (addToFM_C combiner fm_r new_key new_elt) |
addToFM_C1 | combiner key elt size fm_l fm_r new_key new_elt False | = | addToFM_C0 combiner key elt size fm_l fm_r new_key new_elt otherwise |
|
|
addToFM_C2 | combiner key elt size fm_l fm_r new_key new_elt True | = | mkBalBranch key elt (addToFM_C combiner fm_l new_key new_elt) fm_r |
addToFM_C2 | combiner key elt size fm_l fm_r new_key new_elt False | = | addToFM_C1 combiner key elt size fm_l fm_r new_key new_elt (new_key > key) |
|
|
addToFM_C3 | combiner (Branch key elt size fm_l fm_r) new_key new_elt | = | addToFM_C2 combiner key elt size fm_l fm_r new_key new_elt (new_key < key) |
|
|
addToFM_C4 | combiner EmptyFM key elt | = | unitFM key elt |
addToFM_C4 | vvx vvy vvz vwu | = | addToFM_C3 vvx vvy vvz vwu |
|
| emptyFM :: FiniteMap a b
|
| findMax :: FiniteMap a b -> (a,b)
findMax | (Branch key elt xw xx EmptyFM) | = | (key,elt) |
findMax | (Branch key elt xy xz fm_r) | = | findMax fm_r |
|
| findMin :: FiniteMap b a -> (b,a)
findMin | (Branch key elt wy EmptyFM wz) | = | (key,elt) |
findMin | (Branch key elt xu fm_l xv) | = | findMin fm_l |
|
| mkBalBranch :: Ord b => b -> a -> FiniteMap b a -> FiniteMap b a -> FiniteMap b a
mkBalBranch | key elt fm_L fm_R | = | mkBalBranch6 key elt fm_L fm_R |
|
|
mkBalBranch6 | key elt fm_L fm_R | = | mkBalBranch6MkBalBranch5 key elt fm_L fm_R key elt fm_L fm_R (mkBalBranch6Size_l key elt fm_L fm_R + mkBalBranch6Size_r key elt fm_L fm_R < Pos (Succ (Succ Zero))) |
|
|
mkBalBranch6Double_L | vxy vxz vyu vyv fm_l (Branch key_r elt_r zy (Branch key_rl elt_rl zz fm_rll fm_rlr) fm_rr) | = | mkBranch (Pos (Succ (Succ (Succ (Succ (Succ Zero)))))) key_rl elt_rl (mkBranch (Pos (Succ (Succ (Succ (Succ (Succ (Succ Zero))))))) vxy vxz fm_l fm_rll) (mkBranch (Pos (Succ (Succ (Succ (Succ (Succ (Succ (Succ Zero)))))))) key_r elt_r fm_rlr fm_rr) |
|
|
mkBalBranch6Double_R | vxy vxz vyu vyv (Branch key_l elt_l zw fm_ll (Branch key_lr elt_lr zx fm_lrl fm_lrr)) fm_r | = | mkBranch (Pos (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ Zero))))))))))) key_lr elt_lr (mkBranch (Pos (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ Zero)))))))))))) key_l elt_l fm_ll fm_lrl) (mkBranch (Pos (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ Zero))))))))))))) vxy vxz fm_lrr fm_r) |
|
|
mkBalBranch6MkBalBranch0 | vxy vxz vyu vyv fm_L fm_R (Branch vuu vuv vuw fm_rl fm_rr) | = | mkBalBranch6MkBalBranch02 vxy vxz vyu vyv fm_L fm_R (Branch vuu vuv vuw fm_rl fm_rr) |
|
|
mkBalBranch6MkBalBranch00 | vxy vxz vyu vyv fm_L fm_R vuu vuv vuw fm_rl fm_rr True | = | mkBalBranch6Double_L vxy vxz vyu vyv fm_L fm_R |
|
|
mkBalBranch6MkBalBranch01 | vxy vxz vyu vyv fm_L fm_R vuu vuv vuw fm_rl fm_rr True | = | mkBalBranch6Single_L vxy vxz vyu vyv fm_L fm_R |
mkBalBranch6MkBalBranch01 | vxy vxz vyu vyv fm_L fm_R vuu vuv vuw fm_rl fm_rr False | = | mkBalBranch6MkBalBranch00 vxy vxz vyu vyv fm_L fm_R vuu vuv vuw fm_rl fm_rr otherwise |
|
|
mkBalBranch6MkBalBranch02 | vxy vxz vyu vyv fm_L fm_R (Branch vuu vuv vuw fm_rl fm_rr) | = | mkBalBranch6MkBalBranch01 vxy vxz vyu vyv fm_L fm_R vuu vuv vuw fm_rl fm_rr (sizeFM fm_rl < Pos (Succ (Succ Zero)) * sizeFM fm_rr) |
|
|
mkBalBranch6MkBalBranch1 | vxy vxz vyu vyv fm_L fm_R (Branch yz zu zv fm_ll fm_lr) | = | mkBalBranch6MkBalBranch12 vxy vxz vyu vyv fm_L fm_R (Branch yz zu zv fm_ll fm_lr) |
|
|
mkBalBranch6MkBalBranch10 | vxy vxz vyu vyv fm_L fm_R yz zu zv fm_ll fm_lr True | = | mkBalBranch6Double_R vxy vxz vyu vyv fm_L fm_R |
|
|
mkBalBranch6MkBalBranch11 | vxy vxz vyu vyv fm_L fm_R yz zu zv fm_ll fm_lr True | = | mkBalBranch6Single_R vxy vxz vyu vyv fm_L fm_R |
mkBalBranch6MkBalBranch11 | vxy vxz vyu vyv fm_L fm_R yz zu zv fm_ll fm_lr False | = | mkBalBranch6MkBalBranch10 vxy vxz vyu vyv fm_L fm_R yz zu zv fm_ll fm_lr otherwise |
|
|
mkBalBranch6MkBalBranch12 | vxy vxz vyu vyv fm_L fm_R (Branch yz zu zv fm_ll fm_lr) | = | mkBalBranch6MkBalBranch11 vxy vxz vyu vyv fm_L fm_R yz zu zv fm_ll fm_lr (sizeFM fm_lr < Pos (Succ (Succ Zero)) * sizeFM fm_ll) |
|
|
mkBalBranch6MkBalBranch2 | vxy vxz vyu vyv key elt fm_L fm_R True | = | mkBranch (Pos (Succ (Succ Zero))) key elt fm_L fm_R |
|
|
mkBalBranch6MkBalBranch3 | vxy vxz vyu vyv key elt fm_L fm_R True | = | mkBalBranch6MkBalBranch1 vxy vxz vyu vyv fm_L fm_R fm_L |
mkBalBranch6MkBalBranch3 | vxy vxz vyu vyv key elt fm_L fm_R False | = | mkBalBranch6MkBalBranch2 vxy vxz vyu vyv key elt fm_L fm_R otherwise |
|
|
mkBalBranch6MkBalBranch4 | vxy vxz vyu vyv key elt fm_L fm_R True | = | mkBalBranch6MkBalBranch0 vxy vxz vyu vyv fm_L fm_R fm_R |
mkBalBranch6MkBalBranch4 | vxy vxz vyu vyv key elt fm_L fm_R False | = | mkBalBranch6MkBalBranch3 vxy vxz vyu vyv key elt fm_L fm_R (mkBalBranch6Size_l vxy vxz vyu vyv > sIZE_RATIO * mkBalBranch6Size_r vxy vxz vyu vyv) |
|
|
mkBalBranch6MkBalBranch5 | vxy vxz vyu vyv key elt fm_L fm_R True | = | mkBranch (Pos (Succ Zero)) key elt fm_L fm_R |
mkBalBranch6MkBalBranch5 | vxy vxz vyu vyv key elt fm_L fm_R False | = | mkBalBranch6MkBalBranch4 vxy vxz vyu vyv key elt fm_L fm_R (mkBalBranch6Size_r vxy vxz vyu vyv > sIZE_RATIO * mkBalBranch6Size_l vxy vxz vyu vyv) |
|
|
mkBalBranch6Single_L | vxy vxz vyu vyv fm_l (Branch key_r elt_r vux fm_rl fm_rr) | = | mkBranch (Pos (Succ (Succ (Succ Zero)))) key_r elt_r (mkBranch (Pos (Succ (Succ (Succ (Succ Zero))))) vxy vxz fm_l fm_rl) fm_rr |
|
|
mkBalBranch6Single_R | vxy vxz vyu vyv (Branch key_l elt_l yy fm_ll fm_lr) fm_r | = | mkBranch (Pos (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ Zero))))))))) key_l elt_l fm_ll (mkBranch (Pos (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ (Succ Zero)))))))))) vxy vxz fm_lr fm_r) |
|
|
mkBalBranch6Size_l | vxy vxz vyu vyv | = | sizeFM vyu |
|
|
mkBalBranch6Size_r | vxy vxz vyu vyv | = | sizeFM vyv |
|
| mkBranch :: Ord a => Int -> a -> b -> FiniteMap a b -> FiniteMap a b -> FiniteMap a b
mkBranch | which key elt fm_l fm_r | = | mkBranchResult key elt fm_l fm_r |
|
|
mkBranchBalance_ok | vwx vwy vwz | = | True |
|
|
mkBranchLeft_ok | vwx vwy vwz | = | mkBranchLeft_ok0 vwx vwy vwz vwx vwz vwx |
|
|
mkBranchLeft_ok0 | vwx vwy vwz fm_l key EmptyFM | = | True |
mkBranchLeft_ok0 | vwx vwy vwz fm_l key (Branch left_key wu wv ww wx) | = | mkBranchLeft_ok0Biggest_left_key fm_l < key |
|
|
mkBranchLeft_ok0Biggest_left_key | vyx | = | fst (findMax vyx) |
|
|
mkBranchLeft_size | vwx vwy vwz | = | sizeFM vwx |
|
|
mkBranchResult | vxu vxv vxw vxx | = | Branch vxu vxv (mkBranchUnbox vxw vxx vxu (Pos (Succ Zero) + mkBranchLeft_size vxw vxx vxu + mkBranchRight_size vxw vxx vxu)) vxw vxx |
|
|
mkBranchRight_ok | vwx vwy vwz | = | mkBranchRight_ok0 vwx vwy vwz vwy vwz vwy |
|
|
mkBranchRight_ok0 | vwx vwy vwz fm_r key EmptyFM | = | True |
mkBranchRight_ok0 | vwx vwy vwz fm_r key (Branch right_key vw vx vy vz) | = | key < mkBranchRight_ok0Smallest_right_key fm_r |
|
|
mkBranchRight_ok0Smallest_right_key | vyy | = | fst (findMin vyy) |
|
|
mkBranchRight_size | vwx vwy vwz | = | sizeFM vwy |
|
| mkBranchUnbox :: Ord a => -> (FiniteMap a b) ( -> (FiniteMap a b) ( -> a (Int -> Int)))
mkBranchUnbox | vwx vwy vwz x | = | x |
|
| sIZE_RATIO :: Int
sIZE_RATIO | | = | Pos (Succ (Succ (Succ (Succ (Succ Zero))))) |
|
| sizeFM :: FiniteMap b a -> Int
sizeFM | EmptyFM | = | Pos Zero |
sizeFM | (Branch yu yv size yw yx) | = | size |
|
| unitFM :: b -> a -> FiniteMap b a
unitFM | key elt | = | Branch key elt (Pos (Succ Zero)) emptyFM emptyFM |
|